#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>  
#include <sys/types.h>  
#include <sys/wait.h> 

using namespace std;

void PrintPending(const sigset_t &pending)
{
    for(int signo = 32; signo > 0; signo--)
    {
        if(sigismember(&pending, signo))
        {
            cout << "1";
        }
        else{
            cout << "0";
        }
    }
    cout << endl;
}

int main()
{
    cout << "pid: " << getpid() << endl;

    // 屏蔽2号信号
    sigset_t set, oset;

    sigemptyset(&set);
    sigemptyset(&oset);

    sigaddset(&set, 2);
    sigprocmask(SIG_BLOCK, &set, &oset);
    
    int cnt = 0;
    // 让进程不断获取当前进程的pending
    sigset_t pending;
    while(1)
    {
        sigpending(&pending);
        PrintPending(pending);
        sleep(1);

        // 对2好信号进行解除屏蔽
		cnt++;
		if(cnt == 16)
		{
            cout << "对2好信号进行解除屏蔽，准备递达" << endl;
			sigprocmask(SIG_SETMASK, &oset, nullptr);
		}
    }
    return 0;
}

// void headler(int signo)
// {
//     cout << "headler: " << signo << endl;
//     // exit(0);
// }

// int main()
// {
//     cout << "pid: " << getpid() << endl;
//     signal(2, headler);

//     sigset_t block, oblock;

//     sigemptyset(&block);
//     sigemptyset(&oblock);

//     for(int signo = 1; signo <= 31; signo++) sigaddset(&block, signo);
//     // sigaddset(&block, 2); // 设置对2号信号的屏蔽

//     sigprocmask(SIG_BLOCK, &block, &oblock);

//     while(1)
//     {
//         cout << "我屏蔽了所有信号 ... ..." << endl;
//         sleep(1);
//     }

//     return 0;
// }

// void handle_sigchld(int signo) {  
//     int status;  
//     pid_t pid;  
//     while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {  
//         if (WIFEXITED(status)) {  
//             printf("Child %d exited with status %d\n", pid, WEXITSTATUS(status));  
//         } else if (WIFSIGNALED(status)) {  
//             printf("Child %d killed by signal %d\n", pid, WTERMSIG(status));  
//         }  
//     }  
// }  
  
// int main() {  
//     pid_t pid;  
//     struct sigaction act;  
  
//     // 设置SIGCHLD信号的处理函数  
//     act.sa_handler = handle_sigchld;  
//     sigemptyset(&act.sa_mask);  
//     act.sa_flags = 0;  
//     sigaction(SIGCHLD, &act, NULL);  
  
//     // 创建子进程  
//     pid = fork();  
//     if (pid < 0) 
//     {  
//         perror("fork");  
//         exit(1);  
//     } 
//     else if (pid == 0)
//      {  
//         // 子进程代码  
//         printf("Child process (PID: %d) is running\n", getpid());  
//         sleep(5); // 模拟子进程工作  
//         exit(0);  // 子进程正常退出  
//     } 
//     else 
//     {  
//         // 父进程代码  
//         printf("Parent process (PID: %d) is running\n", getpid());  
//         // 父进程可以继续执行其他任务，等待SIGCHLD信号来回收子进程  
//         while (1) {  
//             sleep(10); // 模拟父进程工作  
//             printf("Parent process is still running\n");  
//         }  
//     }  
  
//     return 0;  
// }

// volatile int flag = 0;

// void headler(int signo)
// {
//     cout << "signo: " << signo << endl;
//     flag = 1;
//     cout << "change flag to: " << flag << endl;
// }

// int main()
// {
//     signal(2, headler);

//     cout << "pid: " << getpid() << endl;
//     while(!flag);
//     cout << "qiut normal!" << endl;
//     return 0;
// }